home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -in_the_mag- / multitasking / coders / din / doc / din.doc
Text File  |  2000-03-05  |  17KB  |  772 lines

  1.  
  2. TABLE OF CONTENTS
  3.  
  4. din.library/NotifyDinLinks
  5. din.library/ResetDinLinkFlags
  6. din.library/MakeDinObject
  7. din.library/EnableDinObject
  8. din.library/DisableDinObject
  9. din.library/PropagateDinObject
  10. din.library/RemoveDinObject
  11. din.library/LockDinObject
  12. din.library/UnlockDinObject
  13. din.library/FindDinObject
  14. din.library/MakeDinLink
  15. din.library/RemoveDinLink
  16. din.library/ReadLockDinObject
  17. din.library/ReadUnlockDinObject
  18. din.library/WriteLockDinObject
  19. din.library/WriteUnlockDinObject
  20. din.library/LockDinBase
  21. din.library/UnlockDinBase
  22. din.library/InfoDinObject
  23. din.library/FreeInfoDinObject
  24.  
  25.  
  26. din.library/NotifyDinLinks            din.library/NotifyDinLinks
  27.  
  28.     NAME
  29.     NotifyDinLinks -- Notify all links for a DinObject.
  30.  
  31.     SYNOPSIS
  32.     Tasks = NotifyDinLinks(DinObject, Flags)
  33.     D0             A0        D0
  34.  
  35.     ULONG Tasks;
  36.     struct DinObject *DinObject;
  37.     ULONG Flags;
  38.  
  39.     FUNCTION
  40.     Sends a signal to all tasks linked to this DinObject.
  41.  
  42.     The only flag you can safely use is LNK_CHANGE. This function
  43.     will fill in the Flags field for all the DinLinks linked to this
  44.     DinObject and send a signal to the corresponding task.
  45.  
  46.     Use this function to tell everyone that you have changed something
  47.     to your physical object.
  48.  
  49.     INPUTS
  50.         DinObject = pointer to a DinObject (normally created by you).
  51.         Flags = at this moment only LNK_CHANGE is appropriate.
  52.  
  53.     RESULT
  54.         This function will return the number of tasks signaled.
  55.  
  56.     BUGS
  57.  
  58.     SEE ALSO
  59.         ResetDinLinkFlags
  60.     
  61.  
  62. din.library/ResetDinLinkFlags            din.library/ResetDinLinkFlags
  63.  
  64.     NAME
  65.     ResetDinLinkFlags  --  Clear all the notify flags for a DinLink.
  66.  
  67.     SYNOPSIS
  68.     ResetDinLinkFlags(DinLink)
  69.                 A0
  70.  
  71.     struct DinLink *DinLink;
  72.  
  73.     FUNCTION
  74.     Clears all notify flags in the DinLink Flags field.
  75.  
  76.     Use this function after you have examined the DinLink flags.
  77.     If you forget to do this you will not be able to distinguish
  78.     between different notify signals.
  79.  
  80.     Note! The only flag not cleared is the LNK_KILLED flag.
  81.  
  82.     INPUTS
  83.         DinLink = a pointer to a DinLink structure
  84.  
  85.     RESULT
  86.         None
  87.  
  88.     BUGS
  89.  
  90.     SEE ALSO
  91.         NotifyDinLinks
  92.  
  93.  
  94. din.library/MakeDinObject            din.library/MakeDinObject
  95.  
  96.     NAME
  97.     MakeDinObject  --  Make a DinObject.
  98.  
  99.     SYNOPSIS
  100.     DinObject = MakeDinObject(Name,Type,Flags,PhysicalObject,Size)
  101.     D0               A0    D0    D1    A1       D2
  102.  
  103.     struct DinObject *DinObject;
  104.     char *Name;
  105.     UWORD Type;
  106.     ULONG Flags;
  107.     APTR PhysicalObject;
  108.     ULONG Size;
  109.  
  110.     FUNCTION
  111.         Make a DinObject available to all possible linkers.
  112.  
  113.     There are three possible actions for this function:
  114.     - There is already an object with this name.
  115.       Return NULL, this is an error.
  116.     - There is no one waiting for this object to arrive.
  117.       The object is created.
  118.     - There are already links to this object.
  119.       Create the object and send a LNK_NEW signal to all linked tasks.
  120.  
  121.     'Name' is copied to an internal buffer, so you don't need to worry
  122.     about this one.
  123.  
  124.     It is perfectly legal to make an object and exit. This is called a
  125.     resident object. Because it would be nice if you could remove this
  126.     object later on, you should Propagate the ownership of the object
  127.     to nobody before you exit (with PropagateDinObject). This is
  128.     because only the owner can remove a DinObject.
  129.  
  130.     What this function does:
  131.     - Allocate the object structure.
  132.     - Initialize the two semaphores.
  133.     - Initialize the DinLink list.
  134.     - Set the owner pointer to the current task.
  135.     - Set the pointer to the Physical object. (Note that you don't
  136.       have to initialize the physical object before you create the
  137.       DinObject. You can do this later. You should, however, do this
  138.       before you enable the DinObject.
  139.     - The DinObject is disabled by default. Enable it with EnableDinObject.
  140.     - Link the DinObject in the library list.
  141.     - If the DinObject had some links, notify signals are send (LNK_NEW).
  142.  
  143.     A DinObject corresponds directly with a physical object. The physical
  144.     objects that are supported at this moment are:
  145.     - OBJECTDATA :
  146.         Binary data.
  147.         struct ObjectData
  148.             {
  149.               ULONG Size;
  150.               APTR Data;
  151.             }
  152.         Data must be allocated with 'AllocMem (Size,MEMF...)'.
  153.         If you use this object type you are responsible for your own
  154.         physical object interpretation. The din library only knows how
  155.         to deallocate your 'Data'.
  156.     - OBJECTTEXT :
  157.         Text data.
  158.         struct ObjectText
  159.             {
  160.               ULONG Lines;
  161.               struct ObjectLine *FirstLine;
  162.             }
  163.         struct ObjectLine
  164.             {
  165.               struct ObjectLine *Next;
  166.               char FirstByte;
  167.             }
  168.         Lines is the number of lines in the text.
  169.         FirstLine points to the first line of text (pffh, how difficult :-)
  170.     - OBJECTIMAGE :
  171.         Image data.
  172.         struct ImageData
  173.             {
  174.               struct RastPort *rp;
  175.               struct Rectangle Rect;
  176.             }
  177.         RastPort is ofcourse the RastPort for the drawing.
  178.         Rect is a rectangle describing the image in this RastPort. If all
  179.         values in the rectangle are ~0, the image corresponds with the
  180.         complete RastPort.
  181.     - OBJECTACK :
  182.         Acknowledgement object.
  183.         There is no structure for this object.
  184.         It is simply a way to let someone know that you are here.
  185.         PhysicalObject is NULL and Size is 0.
  186.  
  187.     INPUTS
  188.         Name = pointer to a unique name. If the name already exists, you will
  189.           get an error.
  190.         Type = the physical object type. Supported physical objects at this moment
  191.           are:
  192.             - OBJECTDATA : Binary data, for own interpretation.
  193.             - OBJECTTEXT : Text data.
  194.             - OBJECTIMAGE : RastPort.
  195.             - OBJECTACK : Acknowledgement.
  196.         Flags = OB_READONLY if only the owner may write on this object.
  197.         PhysicalObject = pointer to the physical object. You may initialize this
  198.           later.
  199.         Size = size of the physical object structure.
  200.  
  201.     RESULT
  202.         Pointer to the freshly created DinObject or NULL if no success.
  203.  
  204.     BUGS
  205.  
  206.     SEE ALSO
  207.     RemoveDinObject
  208.  
  209.  
  210. din.library/EnableDinObject            din.library/EnableDinObject
  211.  
  212.     NAME
  213.     EnableDinObject  --  Make a DinObject available for use.
  214.  
  215.     SYNOPSIS
  216.     Success = EnableDinObject(DinObject)
  217.     D0                 A0
  218.  
  219.     BOOL Success;
  220.     struct DinObject *DinObject;
  221.  
  222.     FUNCTION
  223.         Make a DinObject available for use.
  224.  
  225.     Only the owner of the DinObject can enable it.
  226.     This function sends a LNK_ENABLE signal to all linked tasks.
  227.  
  228.     INPUTS
  229.         DinObject = pointer to a DinObject.
  230.  
  231.     RESULT
  232.         FALSE if you are not allowed to enable this DinObject.
  233.  
  234.     BUGS
  235.  
  236.     SEE ALSO
  237.     DisableDinObject
  238.  
  239.  
  240. din.library/DisableDinObject            din.library/DisableDinObject
  241.  
  242.     NAME
  243.     DisableDinObject  --  Make a DinObject unavailable for use.
  244.  
  245.     SYNOPSIS
  246.     Success = DisableDinObject(DinObject)
  247.     D0                  A0
  248.  
  249.     BOOL Success;
  250.     struct DinObject *DinObject;
  251.  
  252.     FUNCTION
  253.         Make a DinObject unavailable for use.
  254.  
  255.     Only the owner of the DinObject can disable it.
  256.     This function sends a LNK_DISABLE signal to all linked tasks.
  257.     When someone is still writing or reading on the physical object for
  258.     this DinObject, this function will block.
  259.  
  260.     INPUTS
  261.         DinObject = pointer to a DinObject.
  262.  
  263.     RESULT
  264.         FALSE if you are not allowed to disable this DinObject.
  265.  
  266.     BUGS
  267.  
  268.     SEE ALSO
  269.     EnableDinObject
  270.  
  271.  
  272. din.library/PropagateDinObject            din.library/PropagateDinObject
  273.  
  274.     NAME
  275.     PropagateDinObject  --  Change the ownership of a DinObject.
  276.  
  277.     SYNOPSIS
  278.     Success = PropagateDinObject(DinObject,Task)
  279.     D0                A0    A1
  280.  
  281.     BOOL Success;
  282.     struct DinObject *DinObject;
  283.     struct Task *Task;
  284.  
  285.     FUNCTION
  286.         Change the ownership of a DinObject.
  287.  
  288.     Only the owner of the DinObject can change the ownership.
  289.     If task == NULL no one will be the owner.
  290.  
  291.     The owner of a DinObject can:
  292.     - Remove, Disable and Enable it.
  293.     - Change the ownership.
  294.     - Write on a READ ONLY physical object.
  295.  
  296.     INPUTS
  297.         DinObject = pointer to a DinObject.
  298.         Task = pointer to a task or NULL for no one.
  299.  
  300.     RESULT
  301.         FALSE if you are not the owner of this DinObject.
  302.  
  303.     BUGS
  304.     Does not check for ownership.
  305.  
  306.     SEE ALSO
  307.  
  308.  
  309. din.library/RemoveDinObject            din.library/RemoveDinObject
  310.  
  311.     NAME
  312.     RemoveDinObject  --  Remove a DinObject.
  313.  
  314.     SYNOPSIS
  315.     Success = RemoveDinObject(DinObject)
  316.     D0                 A0
  317.  
  318.     BOOL Success;
  319.     struct DinObject *DinObject;
  320.  
  321.     FUNCTION
  322.         Remove a DinObject.
  323.  
  324.     Only the owner of the DinObject can remove a DinObject.
  325.  
  326.     This function will send a LNK_KILLED signal to all tasks still linked
  327.     to this DinObject. Note that this function will NOT remove the links
  328.     attached to this DinObject. The linkers themselves are responsible for
  329.     removing their DinLinks after they received a LNK_KILLED signal.
  330.  
  331.     This function will NOT deallocate the physical object. You are
  332.     responsible for that. Note that if you want to deallocate the
  333.     physical object before you remove the DinObject, you MUST disable
  334.     the DinObject first.
  335.  
  336.     INPUTS
  337.         DinObject = pointer to a DinObject. You can safely pass a NULL pointer.
  338.  
  339.     RESULT
  340.         FALSE if you are not the owner of this DinObject.
  341.  
  342.     BUGS
  343.  
  344.     SEE ALSO
  345.         MakeDinObject
  346.  
  347.  
  348. din.library/LockDinObject            din.library/LockDinObject
  349.  
  350.     NAME
  351.     LockDinObject  --  Lock the DinObject structure.
  352.  
  353.     SYNOPSIS
  354.     Success = LockDinObject(DinObject)
  355.     D0               A0
  356.  
  357.     BOOL Success;
  358.     struct DinObject *DinObject;
  359.  
  360.     FUNCTION
  361.     Lock The DinObject structure.
  362.  
  363.     Use this function if you want to look at the fields in the DinObject
  364.     structure.
  365.     Always pair a LockDinObject with an UnlockDinObject.
  366.  
  367.     Locks can be nested.
  368.  
  369.     INPUTS
  370.         DinObject = pointer to a DinObject.
  371.  
  372.     RESULT
  373.         FALSE if the DinObject is not ready (if it is a Dummy object).
  374.  
  375.     BUGS
  376.     Avoid these functions if possible. Use InfoDinObject instead.
  377.  
  378.     SEE ALSO
  379.         UnlockDinObject, InfoDinObject
  380.  
  381.  
  382. din.library/UnlockDinObject            din.library/UnlockDinObject
  383.  
  384.     NAME
  385.     UnlockDinObject  --  Lock the DinObject structure.
  386.  
  387.     SYNOPSIS
  388.     UnlockDinObject(DinObject)
  389.                A0
  390.  
  391.     BOOL Success;
  392.     struct DinObject *DinObject;
  393.  
  394.     FUNCTION
  395.     Unlock The DinObject structure.
  396.  
  397.     Only use this function if you have Locked the DinObject first.
  398.     Always pair a LockDinObject with an UnlockDinObject.
  399.  
  400.     Locks can be nested.
  401.  
  402.     INPUTS
  403.         DinObject = pointer to a DinObject.
  404.  
  405.     RESULT
  406.     None.
  407.  
  408.     BUGS
  409.     Avoid these functions if possible. Use InfoDinObject instead.
  410.  
  411.     SEE ALSO
  412.         LockDinObject, InfoDinObject
  413.  
  414.  
  415. din.library/FindDinObject            din.library/FindDinObject
  416.  
  417.     NAME
  418.     FindDinObject  --  Search a named DinObject.
  419.  
  420.     SYNOPSIS
  421.     DinObject = FindDinObject(Name)
  422.     D0               A0
  423.  
  424.     struct DinObject *DinObject;
  425.     char *Name;
  426.  
  427.     FUNCTION
  428.     Search a DinObject in the DinObject list.
  429.  
  430.     This function arbitrates for access to the DinObject list.
  431.  
  432.     INPUTS
  433.         Name = pointer to a NULL-terminated name.
  434.  
  435.     RESULT
  436.     Pointer to a DinObject or NULL if not found.
  437.  
  438.     BUGS
  439.  
  440.     SEE ALSO
  441.  
  442.  
  443. din.library/MakeDinLink                din.library/MakeDinLink
  444.  
  445.     NAME
  446.     MakeDinLink  --  Create a link to a DinObject.
  447.  
  448.     SYNOPSIS
  449.     DinLink = MakeDinLink(DinObject,[Name])
  450.     D0              A0      A1
  451.  
  452.     struct DinLink *DinLink;
  453.     struct DinObject *DinObject;
  454.     char *Name;
  455.  
  456.     FUNCTION
  457.     Create a DinLink to a DinObject.
  458.  
  459.     There are three scenarios:
  460.     - The DinObject exists.
  461.       The Link is immediate, no LNK_NEW will be send.
  462.     - The DinObject does not exist.
  463.       This Function will create a dummy DinObject with the name you
  464.       specified. The LNK_WAITING4OB flag is set. When the object
  465.       is created you will get a LNK_NEW signal.
  466.     - The DinObject does exist as a dummy.
  467.       The LNK_WAITING4OB flag is set. When the object is created
  468.       you will get a LNK_NEW signal.
  469.  
  470.     This means that a link will almost always succeed (except when
  471.     there is not enough memory) even if the object does not exist.
  472.     If you only want to link to an existing DinObject you should use
  473.     the following code (or something equivalent):
  474.  
  475.       link = MakeDinLink (0,"Object");
  476.       if (!link)
  477.         {
  478.           printf ("Not enough memory\n");
  479.           exit (1);
  480.         }
  481.       if (link->Flags & LNK_WAITING4OB)
  482.         {
  483.           RemoveDinLink (link);
  484.           printf ("Object does not exist\n");
  485.           exit (1);
  486.         }
  487.  
  488.     Note that you MUST check the LNK_WAITING4OB flag and handle
  489.     this situation correctly.
  490.     Also note that your program must be able to respond to all
  491.     available signals correctly:
  492.     - LNK_CHANGE :
  493.       The physical object has changed.
  494.     - LNK_NEW :
  495.       The object has just been made.
  496.     - LNK_DISABLE :
  497.       The object has been disabled.
  498.     - LNK_ENABLE :
  499.       The object has been enabled.
  500.     - LNK_KILLED :
  501.       The object has been killed. You should remove your DinLink as
  502.       soon as possible.
  503.  
  504.     This function allocates a Signal.
  505.  
  506.     INPUTS
  507.         DinObject = pointer to a DinObject. if NULL Name is used.
  508.         Name = pointer to a NULL-terminated name.
  509.  
  510.     RESULT
  511.     Pointer to a DinLink or NULL if an error occured.
  512.  
  513.     BUGS
  514.     Future plans incorporate a system to share a signal for several links.
  515.  
  516.     SEE ALSO
  517.         RemoveDinLink
  518.  
  519.  
  520. din.library/RemoveDinLink            din.library/RemoveDinLink
  521.  
  522.     NAME
  523.     RemoveDinLink  --  Remove a link to a DinObject.
  524.  
  525.     SYNOPSIS
  526.     RemoveDinLink(DinLink)
  527.              A0
  528.  
  529.     struct DinLink *DinLink;
  530.  
  531.     FUNCTION
  532.         Remove a link to a DinObject.
  533.  
  534.     If the link is the last link in a dummy object, this dummy object
  535.     is removed.
  536.     If the DinObject is waiting to be deleted and your link is the
  537.     last to be removed, the dummy object is removed.
  538.  
  539.     INPUTS
  540.         DinLink = pointer to a DinLink. It is safe to call this routine with
  541.           a NULL pointer.
  542.  
  543.     RESULT
  544.     None.
  545.  
  546.     BUGS
  547.  
  548.     SEE ALSO
  549.         MakeDinLink
  550.  
  551.  
  552. din.library/ReadLockDinObject            din.library/ReadLockDinObject
  553.  
  554.     NAME
  555.     ReadLockDinObject  --  Lock a DinObject for reading.
  556.  
  557.     SYNOPSIS
  558.     Success = ReadLockDinObject(DinObject)
  559.     D0                A0
  560.  
  561.     BOOL Success;
  562.     struct DinObject *DinObject;
  563.  
  564.     FUNCTION
  565.     Lock the physical object of a DinObject for reading.
  566.  
  567.     Note that there can be more readers at the same time, but only
  568.     one writer.
  569.  
  570.     INPUTS
  571.         DinObject = pointer to a DinObject.
  572.  
  573.     RESULT
  574.     FALSE if object is disabled.
  575.  
  576.     BUGS
  577.  
  578.     SEE ALSO
  579.     ReadUnlockDinObject, WriteLockDinObject, WriteUnlockDinObject
  580.  
  581.  
  582. din.library/ReadUnlockDinObject            din.library/ReadUnlockDinObject
  583.  
  584.     NAME
  585.     ReadUnlockDinObject  --  Unlock a DinObject for reading.
  586.  
  587.     SYNOPSIS
  588.     ReadUnlockDinObject(DinObject)
  589.                 A0
  590.  
  591.     struct DinObject *DinObject;
  592.  
  593.     FUNCTION
  594.     Unlock the physical object of a DinObject for reading.
  595.  
  596.     Note that there can be more readers at the same time, but only
  597.     one writer.
  598.  
  599.     INPUTS
  600.         DinObject = pointer to a DinObject.
  601.  
  602.     RESULT
  603.     None.
  604.  
  605.     BUGS
  606.  
  607.     SEE ALSO
  608.     ReadLockDinObject, WriteLockDinObject, WriteUnlockDinObject
  609.  
  610.  
  611. din.library/WriteLockDinObject            din.library/WriteLockDinObject
  612.  
  613.     NAME
  614.     WriteLockDinObject  --  Lock a DinObject for writing.
  615.  
  616.     SYNOPSIS
  617.     Success = WriteLockDinObject(DinObject)
  618.     D0                A0
  619.  
  620.     BOOL Success;
  621.     struct DinObject *DinObject;
  622.  
  623.     FUNCTION
  624.     Lock the physical object of a DinObject for writing.
  625.  
  626.     Note that there can be more readers at the same time, but only
  627.     one writer.
  628.  
  629.     INPUTS
  630.         DinObject = pointer to a DinObject.
  631.  
  632.     RESULT
  633.     FALSE if object is disabled.
  634.  
  635.     BUGS
  636.  
  637.     SEE ALSO
  638.     ReadLockDinObject, ReadUnlockDinObject, WriteUnlockDinObject
  639.  
  640.  
  641. din.library/WriteUnlockDinObject        din.library/WriteUnlockDinObject
  642.  
  643.     NAME
  644.     WriteUnlockDinObject  --  Unlock a DinObject for writing.
  645.  
  646.     SYNOPSIS
  647.     WriteUnlockDinObject(DinObject)
  648.                 A0
  649.  
  650.     struct DinObject *DinObject;
  651.  
  652.     FUNCTION
  653.     Unlock the physical object of a DinObject for writing.
  654.  
  655.     Note that there can be more readers at the same time, but only
  656.     one writer.
  657.  
  658.     INPUTS
  659.         DinObject = pointer to a DinObject.
  660.  
  661.     RESULT
  662.     None.
  663.  
  664.     BUGS
  665.  
  666.     SEE ALSO
  667.     ReadUnlockDinObject, ReadLockDinObject, WriteLockDinObject
  668.  
  669.  
  670. din.library/LockDinBase                din.library/LockDinBase
  671.  
  672.     NAME
  673.     LockDinBase  --  Lock DinBase for reading.
  674.  
  675.     SYNOPSIS
  676.     LockDinBase()
  677.  
  678.     FUNCTION
  679.     Lock DinBase for reading.
  680.  
  681.     INPUTS
  682.     None.
  683.  
  684.     RESULT
  685.     None.
  686.  
  687.     BUGS
  688.  
  689.     SEE ALSO
  690.     UnlockDinBase
  691.  
  692.  
  693. din.library/UnlockDinBase            din.library/UnlockDinBase
  694.  
  695.     NAME
  696.     UnlockDinBase  --  Unlock DinBase for reading.
  697.  
  698.     SYNOPSIS
  699.     UnlockDinBase()
  700.  
  701.     FUNCTION
  702.     Unlock DinBase for reading.
  703.  
  704.     INPUTS
  705.     None.
  706.  
  707.     RESULT
  708.     None.
  709.  
  710.     BUGS
  711.  
  712.     SEE ALSO
  713.     LockDinBase
  714.  
  715.  
  716. din.library/InfoDinObject            din.library/InfoDinObject
  717.  
  718.     NAME
  719.     InfoDinObject  --  Copies readable fields from a DinObject.
  720.  
  721.     SYNOPSIS
  722.     InfoDinObject = InfoDinObject(DinObject)
  723.     D0                  A0
  724.  
  725.     struct InfoDinObject *InfoDinObject;
  726.     struct DinObject *DinObject;
  727.  
  728.     FUNCTION
  729.     This function copies some readable fields from the DinObject to
  730.     a InfoDinObject structure (see din.h for details). It is the
  731.     recommended way to get some information from a DinObject.
  732.  
  733.     This function allocates a InfoDinObject for you and returns the
  734.     pointer to it. Use FreeInfoDinObject to free this block.
  735.  
  736.     INPUTS
  737.     DinObject = pointer to a DinObject.
  738.  
  739.     RESULT
  740.     Pointer to a InfoDinObject structure or NULL if not enough memory.
  741.  
  742.     BUGS
  743.  
  744.     SEE ALSO
  745.     FreeInfoDinObject
  746.  
  747.  
  748. din.library/FreeInfoDinObject            din.library/FreeInfoDinObject
  749.  
  750.     NAME
  751.     FreeInfoDinObject  --  Frees the InfoDinObject created by InfoDinObject.
  752.  
  753.     SYNOPSIS
  754.     FreeInfoDinObject(InfoDinObject)
  755.                 A0
  756.  
  757.     struct InfoDinObject *InfoDinObject;
  758.  
  759.     FUNCTION
  760.     Use this function to free the block obtained by InfoDinObject.
  761.  
  762.     INPUTS
  763.     InfoDinObject = pointer to a InfoDinObject (can be NULL).
  764.  
  765.     RESULT
  766.     None.
  767.  
  768.     BUGS
  769.  
  770.     SEE ALSO
  771.     InfoDinObject
  772.